package ACWing;

import java.util.Scanner;

/**
 * @author ShadowLim
 * @create 2022-03-21-20:12
 */
public class 选取数对 {
    /**
     * 题目大意
     * 从数组中选出k个长度为m的不相邻区间，求k个区间求和的最大值。
     *
     * 思路
     * 序列求和不难联想到前缀和。呢么我们可以预处理出来所以可选的区间，然后做dp。
     *
     * 状态转移
     * f[i][j]表现从前i个区间里选，恰好选了j个区间的最大值。
     * 呢么就可以分为第i个区间选不选。
     * if (i−m<0)  f[i][j]=max(f[i−1][j],w[i]);
     * else f[i][j]=max(f[i−1][j],f[i−m][j−1]+w[i]);
     * 至于为什么是i−m，是因为选了这个区间，由于题目限制，它前面的m−1个区间就不能选了。
     * 链接：https://www.acwing.com/solution/content/72485/
     *
     * @param args
     */

    /**
     * 第二个条件：r_i - l_i + 1 = m 等价于区间[l_i, r _i]的长度为m
     * @param args
     */
//    static int N  = 5010;
//    static long[] a = new long[N];
//    static long[] b = new long[N];
//    static long[][] f = new long[N][N];
//    static long[] w = new long[N];
//
//    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int n = scanner.nextInt(), m = scanner.nextInt(), k = scanner.nextInt();
//        for (int i = 1; i <= n; i++) {
//            a[i] = scanner.nextInt();
//            b[i] = b[i - 1] + a[i]; // 前缀和
//        }
//        int cnt = 0;
//        for (int i = 1; i  + m - 1 <= n; i++) {
//            w[++cnt] = b[i + m - 1] - b[i - 1];    // 预处理区间
//        }
//        for (int i = 1; i <= cnt; i++) {
//            for (int j = 1; j <= k; j++) {
//                if (i - m < 0) {
//                    f[i][j] = Math.max(f[i - 1][j], w[i]);
//                } else {
//                    f[i][j] = Math.max(f[i - 1][j], f[i - m][j - 1] + w[i]);    //此时最多选择一个区间
//                }
//            }
//        }
//        System.out.println(f[cnt][k]);
//    }

    /**
     * 闫式dp分析法
     * 状态表示f[i][j]:表示在前i个数中选，j个区间的所有集合,属性:max
     * 状态计算f[i][j]:根据最后一个区间是否包含最后一个点i来进行集合划分
     * 1.不包含:f[i][j]=max(f[i][j],f[i-1][j])
     * 2.包含:f[i][j]=max(f[i][j],f[i-m][j-1]+sum[i]-sum[i-m]) //如果包含i的话最后一个区间的右端点就是i
     */

    static int N  = 5010;
    static long[] a = new long[N];
    static long[] sum = new long[N];
    static long[][] f = new long[N][N];

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), m = scanner.nextInt(), k = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = scanner.nextInt();
            sum[i] = sum[i - 1] + a[i]; // 前缀和
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= k; j++) {
                f[i][j] = f[i - 1][j];
                if (i - m + 1 >= 1) {
                    long num = f[i- m][j - 1] + sum[i] - sum[i - m];
                    f[i][j] = Math.max(f[i][j], num);
                }
            }
        }
        System.out.println(f[n][k]);
    }
}
